cordova.define("mamp-plugin-geolocation", function(require, exports, module) {

var argscheck = require('cordova/argscheck'),
    exec = require('cordova/exec'),
    geolocation = require('cordova-plugin-geolocation.geolocation');
    compass = require('cordova-plugin-device-orientation.compass');

var mampGeolocation = {

	/**
	*所有方法获取失败的回调中，错误信息结构如下：
	function onError(error) {
        alert('code: '    + error.code    + '\n' +
              'message: ' + error.message + '\n');
    };
	*/

	/* BEGIN -- Position methods */

	/**
	*地址位置成功获取的回调中，地理位置结构如下：
	var onSuccess = function(position) {
        alert('Latitude: '          + position.coords.latitude          + '\n' +
              'Longitude: '         + position.coords.longitude         + '\n' +
              'Altitude: '          + position.coords.altitude          + '\n' +
              'Accuracy: '          + position.coords.accuracy          + '\n' +
              'Altitude Accuracy: ' + position.coords.altitudeAccuracy  + '\n' +
              'Heading: '           + position.coords.heading           + '\n' +
              'Speed: '             + position.coords.speed             + '\n' +
              'Timestamp: '         + position.timestamp                + '\n');
    };
	*/

	/**
	*注册地址位置事件时，可配置的参数如下：
	var option = {
		maximumAge: 3000,          获取地理位置变化事件的最大间隔事件，单位为毫秒
		timeout: 5000,             注册获取地址位置变化事件请求的超时时间，超时获得有效的位置数据时，对应的错误回调将会触发。单位为毫秒
		enableHighAccuracy: true   是否开启获取地址位置的高精度选项。（如使用GPS定位等，具体效果根据不同设备而定）
	};
	*/

	/**
	* 获取当前地理位置.
	*
	* @param {Function} successCallback    成功获取地理位置的回调。		
	* @param {Function} errorCallback      (OPTIONAL)获取地理位置失败的回调。 
	* @param {PositionOptions} options     (OPTIONAL)获取地址位置的设置参数
	*/
	getCurrentPosition:function(successCallback, errorCallback, options) {
		if (options !== null) {
			geolocation.getCurrentPosition(successCallback, errorCallback, options);
		} else {
			geolocation.getCurrentPosition(successCallback, errorCallback);
		}
	},

	/**
	 * 注册地理位置变化事件。当设备地理位置变化时，注册的successCallback回调将被触发。
	 *
	 * @param {Function} successCallback    地理位置变化事件成功触发时的回调
	 * @param {Function} errorCallback      (OPTIONAL)获取地理位置失败的回调
	 * @param {PositionOptions} options     (OPTIONAL)注册监听地址位置变化回调的设置参数
	 * @return String                       成功注册的监听器ID，移除监听时需要.
	 */
	registerPositionChangedCallback:function(successCallback, errorCallback, options) {
		if (options !== null) {
			return geolocation.watchPosition(successCallback, errorCallback, options);
		} else {
			return geolocation.watchPosition(successCallback, errorCallback);
		}
	},

	/**
	 * 移除已注册的地理位置变化监听事件.
	 *
	 * @param {String} id       成功注册的地理位置变化监听ID
	 */
	removePositionChangedCallback:function(id) {
		geolocation.clearWatch(id);
	},
	/* END -- Position methods */
    
    /* BEGIN -- Compass Heading methods */

    /**
	*设备磁场方向的回调中，磁场方向信息结构如下：
	var onSuccess = function(compassHeading) {
        var magneticHeading = compassHeading.magneticHeading;      磁场方向角度值，范围为 0-359.99
        var trueHeading = compassHeading.trueHeading;              磁场方向与正北的夹角角度，范围为 0-359.99。负值说明该属性当前无法获取（大部分安卓设备均不支持）
        var headingAccuracy = compassHeading.headingAccuracy;      magneticHeading与相对于trueHeading的夹角角度，范围为 0-359.99
        var timestamp = compassHeading.timestamp                   当前磁场方向信息获取时的时间戳。类型为DOMTimeStamp
    };
	*/

	/**
	*注册获取磁场方向变化事件时，可配置的参数如下：
	var option = {
		frequency: 50,             获取磁场方向数据的时间间隔，单位为毫秒。默认值为100
		filter: 20,                触发磁场方向变化事件的最小方向变化阈值，设置该参数时，frequency值将被忽略。单位为角度数（0-359.99）
	};
	*/

	/**
	* 获取设备当前磁场方向
	* @param {Function} successCallback 成功获取磁场方向的回调
	* @param {Function} errorCallback   (OPTIONAL)获取磁场方向失败时的回调
	*/
    getCurrentHeading:function(successCallback, errorCallback) {
		compass.getCurrentHeading(successCallback, errorCallback);
	},

	/**
	 * 注册定时获取磁场方向变化事件的回调.
	 * @param {Function} successCallback 成功获取磁场方向的回调
	 * @param {Function} errorCallback   (OPTIONAL)获取磁场方向失败时的回调
	 * @param {HeadingOptions} options   (OPTIONAL)注册监听磁场方向变化回调的设置参数.
	 */
	registerCompassHeadingChangedCallback:function(successCallback, errorCallback, options) {
		if (options !== null) {
			return compass.watchHeading(successCallback, errorCallback, options);
		} else {
			return compass.watchHeading(successCallback, errorCallback);
		}
	},

	/**
	 * 移除已注册的磁场方向变化监听事件.
	 * @param {String} 成功注册的地理位置变化监听ID.
	 */
	removeCompassHeadingChangedCallback:function(id) {
		compass.clearWatch(id);
	},
    /* END -- Compass Heading methods */

    /* BEGIN -- Geocode methods */

	/**
	*获取当前地理位置详细信息的回调中，地址详细信息结构如下：
	var onSuccess = function(addressInfo) {
        var address = addressInfo.address;                当前所在位置的名称
        var province = addressInfo.province;              省份
        var city = addressInfo.city;                      城市
        var district = addressInfo.district;              区县
        var streetName = addressInfo.streetName;          街道名称
        var streetNumber = addressInfo.streetNumber;      街道路牌号
        var latitude = addressInfo.latitude;              经度
        var longitude = addressInfo.longitude;            纬度
    };
	*/

    /**
	* 获取当前地理位置详细信息（所在城市、街道等）.
	*
	* @param {Function} successCallback    成功获取当前地理位置信息的回调
	* @param {Function} errorCallback      (OPTIONAL)获取当前地理位置信息失败时的回调. 
	*/
    getCurrentAddress:function(successCallback, errorCallback) {
    	var onGetPositionSuccess = function(position) {
    		var coordinates = {
        		latitude: position.coords.latitude,
        		longitude: position.coords.longitude
    		};

    		var onGetAddressSuccess = function(addressInfo) {
    			var address = {
        			address: addressInfo.address,
        			province: addressInfo.province,
        			city: addressInfo.city,
        			district: addressInfo.district,
        			streetName: addressInfo.streetName,
        			streetNumber: addressInfo.streetNumber,
        			latitude: addressInfo.latitude,
        			longitude: addressInfo.longitude
    			};
            	successCallback(address);
    		};

    		exec(onGetAddressSuccess, errorCallback, "MAMPGeolocation", "getCurrentAddress", [coordinates]);
    	};
   	 	mampGeolocation.getCurrentPosition(onGetPositionSuccess, errorCallback);
    },

    /**
	*查询关键字的回调中，搜索结果的结构如下：
	var onSuccess = function(searchResult) {
        var keyList = searchResult.keyList;                搜索出的相关地点名称列表
        var cityList = searchResult.cityList;              搜索出的相关地点所在的城市的名称列表
        var districtList = searchResult.districtList;      搜索出的相关地点所属的区县的名称列表
        var poiIdList = searchResult.poiIdList;            搜索出的相关地点的兴趣点ID列表（对应百度地图的POI数据）
        var pointsList = searchResult.pointsList;          搜索出的相关地点的经纬度列表。每个元素均为如下结构：{"latitude":[Number] ,"longitude":[Number]}
    };
	*/

	/**
	*查询关键字的回调中，设置参数如下：
	var option = {
		city: "南京市",             (OPTIONAL)在指定城市内搜索
		key: "金智科技",       待搜索的关键字
	};
	*/

    /**
	* 模糊搜索指定关键字以查询地点.
	*
	* @param {Function} successCallback    成功查询关键字的回调
	* @param {Function} errorCallback      (OPTIONAL)获取当前地理位置信息失败时的回调.
	* @param options                       搜索关键字信息
	*/
    getSugesstionPOI:function(successCallback, errorCallback, option) {
    	var onGetSuggestionPOISuccess = function(suggestionPOI) {
    			var suggestionResult = {
        			keyList: suggestionPOI.keyList,
        			cityList: suggestionPOI.cityList,
        			districtList: suggestionPOI.districtList,
        			poiIDList: suggestionPOI.poiIDList,
        			pointsList: suggestionPOI.pointsList,
    			};
            	successCallback(suggestionResult);
    		};
    	exec(onGetSuggestionPOISuccess, errorCallback, "MAMPGeolocation", "getSuggestionAddress", [option]);
    }
    /* END -- Geocode Heading methods */
}
               
module.exports = mampGeolocation;
});
